///*******************************************************************************
// * Copyright (c) 2006, 2007 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// *     IBM Corporation - initial API and implementation
// *******************************************************************************/
//
//package org.eclipse.ui.tests.manual;
//
//import java.beans.PropertyChangeListener;
//import java.beans.PropertyChangeSupport;
//
//import org.eclipse.core.databinding.DataBindingContext;
//import org.eclipse.core.databinding.beans.BeansObservables;
//import org.eclipse.core.databinding.observable.Realm;
//import org.eclipse.core.databinding.observable.value.IObservableValue;
//import org.eclipse.core.runtime.Assert;
//import org.eclipse.core.runtime.CoreException;
//import org.eclipse.core.runtime.IProgressMonitor;
//import org.eclipse.core.runtime.IStatus;
//import org.eclipse.core.runtime.Status;
//import org.eclipse.core.runtime.SubMonitor;
//import org.eclipse.jface.databinding.swt.SWTObservables;
//import org.eclipse.jface.dialogs.MessageDialog;
//import org.eclipse.jface.layout.GridDataFactory;
//import org.eclipse.jface.layout.GridLayoutFactory;
//import org.eclipse.jface.resource.ImageDescriptor;
//import org.eclipse.jface.window.IShellProvider;
//import org.eclipse.swt.SWT;
//import org.eclipse.swt.events.DisposeEvent;
//import org.eclipse.swt.events.DisposeListener;
//import org.eclipse.swt.widgets.Button;
//import org.eclipse.swt.widgets.Composite;
//import org.eclipse.swt.widgets.Group;
//import org.eclipse.swt.widgets.Label;
//import org.eclipse.swt.widgets.Text;
//import org.eclipse.ui.IEditorInput;
//import org.eclipse.ui.IEditorSite;
//import org.eclipse.ui.IFileEditorInput;
//import org.eclipse.ui.ISaveablePart;
//import org.eclipse.ui.ISaveablesSource;
//import org.eclipse.ui.PartInitException;
//import org.eclipse.ui.PlatformUI;
//import org.eclipse.ui.Saveable;
//import org.eclipse.ui.internal.WorkbenchMessages;
//import org.eclipse.ui.internal.WorkbenchPlugin;
//import org.eclipse.ui.part.EditorPart;
//import org.eclipse.ui.progress.IJobRunnable;
//
///**
// * @since 3.3
// * 
// */
//public class TestBackgroundSaveEditor extends EditorPart implements
//		ISaveablesSource {
//
//	public class MySaveable extends Saveable {
//
//		PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
//
//		private boolean dirty;
//
//		public void doSave(IProgressMonitor monitor) throws CoreException {
//			SubMonitor subMonitor = SubMonitor.convert(monitor, 2);
//			IJobRunnable runnable = doSave(subMonitor.newChild(1), getSite());
//			if (runnable!=null) {
//				runnable.run(subMonitor.newChild(1));
//			}
//			monitor.done();
//		}
//
//		public IJobRunnable doSave(IProgressMonitor monitor,
//				IShellProvider shellProvider) throws CoreException {
//			monitor.beginTask("Saving in the foreground",
//					data.foregroundSaveTime);
//			data.setOutput("");
//			for (int i = 0; i < data.foregroundSaveTime; i++) {
//				if (monitor.isCanceled()) {
//					return null;
//				}
//				try {
//					Thread.sleep(1000);
//				} catch (InterruptedException e) {
//					Thread.currentThread().interrupt();
//				}
//				data.setOutput(data.getInput().substring(0,
//						Math.min(i, data.getInput().length())));
//				monitor.worked(1);
//			}
//			if (data.throwExceptionInForeground) {
//				throw new CoreException(new Status(IStatus.ERROR,
//						"org.eclipse.ui.tests",
//						"Saving in the foreground failed"));
//			}
//			monitor.done();
//			if (!data.saveInBackground) {
//				data.setOutput(data.getInput());
//				setDirty(false);
//				return null;
//			}
//			IJobRunnable result = new IJobRunnable() {
//				public IStatus run(IProgressMonitor monitor) {
//					monitor.beginTask("Saving in the background",
//							data.backgroundSaveTime);
//					for (int i = 0; i < data.backgroundSaveTime; i++) {
//						if (monitor.isCanceled()) {
//							return Status.CANCEL_STATUS;
//						}
//						try {
//							Thread.sleep(1000);
//						} catch (InterruptedException e) {
//							Thread.currentThread().interrupt();
//						}
//						data.setOutput(data.getInput().substring(
//								0,
//								Math.min(i + data.foregroundSaveTime, data
//										.getInput().length())));
//						monitor.worked(1);
//					}
//					if (data.throwExceptionInBackground) {
//						return new Status(IStatus.ERROR,
//								"org.eclipse.ui.tests",
//								"Saving in the background failed");
//					}
//					data.setOutput(data.getInput());
//					setDirty(false);
//					monitor.done();
//					return Status.OK_STATUS;
//				}
//			};
//			return result;
//		}
//
//		public boolean equals(Object object) {
//			return this == object;
//		}
//
//		public ImageDescriptor getImageDescriptor() {
//			return input.getImageDescriptor();
//		}
//
//		public String getName() {
//			return input.getName();
//		}
//
//		public String getToolTipText() {
//			return input.getToolTipText();
//		}
//
//		public int hashCode() {
//			return System.identityHashCode(this);
//		}
//
//		public boolean isDirty() {
//			return dirty;
//		}
//
//		public void setDirty(boolean dirty) {
//			firePropertyChange("dirty", new Boolean(this.dirty), new Boolean(
//					this.dirty = dirty));
//			getSite().getShell().getDisplay().syncExec(new Runnable(){
//				public void run() {
//					TestBackgroundSaveEditor.this
//					.firePropertyChange(ISaveablePart.PROP_DIRTY);
//				}});
//		}
//
//		public void addPropertyChangeListener(String propertyName,
//				PropertyChangeListener listener) {
//			changeSupport.addPropertyChangeListener(propertyName, listener);
//		}
//
//		void firePropertyChange(String propertyName, Object oldValue,
//				Object newValue) {
//			changeSupport.firePropertyChange(propertyName, oldValue, newValue);
//		}
//
//		public void removePropertyChangeListener(String propertyName,
//				PropertyChangeListener listener) {
//			changeSupport.removePropertyChangeListener(propertyName, listener);
//		}
//	}
//
//	private MySaveable mySaveable;
//	private Text inputText;
//	private IEditorInput input;
//
//	public TestBackgroundSaveEditor() {
//		mySaveable = new MySaveable();
//	}
//
//	public void createPartControl(Composite parent) {
//		Realm realm = SWTObservables.getRealm(parent.getDisplay());
//		final DataBindingContext dbc = new DataBindingContext(realm);
//		parent.addDisposeListener(new DisposeListener() {
//			public void widgetDisposed(DisposeEvent e) {
//				dbc.dispose();
//			}
//		});
//
//		final IObservableValue inputObservable = BeansObservables.observeValue(
//				realm, data, "input");
//		final IObservableValue outputObservable = BeansObservables
//				.observeValue(realm, data, "output");
//
//		createInputGroup(parent, dbc, inputObservable);
//		createOptionsGroup(parent, realm, dbc);
//		createOutputGroup(parent, dbc, outputObservable);
//
//		GridLayoutFactory.swtDefaults().numColumns(3).equalWidth(true)
//				.generateLayout(parent);
//	}
//
//	private void createOutputGroup(Composite parent,
//			final DataBindingContext dbc,
//			final IObservableValue outputObservable) {
//		Group outputGroup = new Group(parent, SWT.NONE);
//		outputGroup.setText("Output");
//		Text outputText = new Text(outputGroup, SWT.BORDER | SWT.READ_ONLY
//				| SWT.MULTI);
//		GridDataFactory.fillDefaults().grab(true, true).applyTo(outputText);
//		dbc.bindValue(SWTObservables.observeText(outputText, SWT.NONE),
//				outputObservable, null, null);
//		GridLayoutFactory.swtDefaults().generateLayout(outputGroup);
//	}
//
//	private void createOptionsGroup(Composite parent, Realm realm,
//			final DataBindingContext dbc) {
//		Group optionsGroup = new Group(parent, SWT.NONE);
//		optionsGroup.setText("Options");
//
//		Button dirtyButton = new Button(optionsGroup, SWT.CHECK);
//		new Label(optionsGroup, SWT.NONE).setText("Editor is dirty");
//		IObservableValue dirtyObservable = BeansObservables.observeValue(realm,
//				mySaveable, "dirty");
//		dbc.bindValue(SWTObservables.observeSelection(dirtyButton),
//				dirtyObservable, null, null);
//		// IObservableValue inputAndOutputDiffer = new ComputedValue(realm) {
//		// protected Object calculate() {
//		// return new Boolean(!Util.equals(inputObservable.getValue(),
//		// outputObservable.getValue()));
//		// }
//		// };
//		// dbc.bindValue(dirtyObservable, inputAndOutputDiffer, null);
//
//		Button saveInBackgroundButton = new Button(optionsGroup, SWT.CHECK);
//		new Label(optionsGroup, SWT.NONE)
//				.setText("Do part of the save in the background");
//		dbc.bindValue(SWTObservables.observeSelection(saveInBackgroundButton),
//				BeansObservables.observeValue(realm, data, "saveInBackground"),
//				null, null);
//
//		Button foregroundExceptionButton = new Button(optionsGroup, SWT.CHECK);
//		new Label(optionsGroup, SWT.NONE)
//				.setText("Throw exception while saving in the foreground");
//		dbc.bindValue(SWTObservables
//				.observeSelection(foregroundExceptionButton), BeansObservables
//				.observeValue(realm, data, "throwExceptionInForeground"), null, null);
//
//		Button backgroundExceptionButton = new Button(optionsGroup, SWT.CHECK);
//		new Label(optionsGroup, SWT.NONE)
//				.setText("Throw exception while saving in the background");
//		dbc.bindValue(SWTObservables
//				.observeSelection(backgroundExceptionButton), BeansObservables
//				.observeValue(realm, data, "throwExceptionInBackground"), null, null);
//
//		new Label(optionsGroup, SWT.NONE).setText("Foreground save time:");
//		Text optionsForegroundTime = new Text(optionsGroup, SWT.BORDER);
//		dbc.bindValue(SWTObservables.observeText(optionsForegroundTime,
//				SWT.Modify), BeansObservables.observeValue(realm, data,
//				"foregroundSaveTime"), null, null);
//
//		new Label(optionsGroup, SWT.NONE).setText("Background save time:");
//		Text optionsBackgroundTime = new Text(optionsGroup, SWT.BORDER);
//		dbc.bindValue(SWTObservables.observeText(optionsBackgroundTime,
//				SWT.Modify), BeansObservables.observeValue(realm, data,
//				"backgroundSaveTime"), null, null);
//
//		GridLayoutFactory.swtDefaults().numColumns(2).generateLayout(
//				optionsGroup);
//	}
//
//	private void createInputGroup(Composite parent,
//			final DataBindingContext dbc, final IObservableValue inputObservable) {
//		Group inputGroup = new Group(parent, SWT.NONE);
//		inputGroup.setText("Input");
//
//		inputText = new Text(inputGroup, SWT.BORDER | SWT.MULTI);
//		dbc.bindValue(SWTObservables.observeText(inputText, SWT.Modify),
//				inputObservable, null, null);
//
//		GridLayoutFactory.swtDefaults().generateLayout(inputGroup);
//	}
//
//	public void doSave(IProgressMonitor monitor) {
//		try {
//			mySaveable.doSave(monitor);
//		} catch (CoreException e) {
//			String title = "Save failed";
//			WorkbenchPlugin.log(title, new Status(IStatus.WARNING,
//					PlatformUI.PLUGIN_ID, 0, title, e));
//			MessageDialog.openError(getSite().getShell(),
//					WorkbenchMessages.Error, title + ':' + e.getMessage());
//		}
//	}
//
//	public void doSaveAs() {
//		Assert.isTrue(false, "Should not be called");
//	}
//
//	public void init(IEditorSite site, IEditorInput input)
//			throws PartInitException {
//		if (!(input instanceof IFileEditorInput))
//			throw new PartInitException(
//					"Invalid Input: Must be IFileEditorInput");
//		setSite(site);
//		setInput(input);
//		this.input = input;
//	}
//
//	public boolean isDirty() {
//		return mySaveable.isDirty();
//	}
//
//	public boolean isSaveAsAllowed() {
//		return false;
//	}
//
//	public void setFocus() {
//		inputText.setFocus();
//	}
//
//	public static class Data {
//		PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
//		public String input = "";
//		public String output = "";
//		public String buffer;
//		public boolean saveInBackground;
//		public boolean throwExceptionInForeground;
//		public boolean throwExceptionInBackground;
//		public int foregroundSaveTime;
//		public int backgroundSaveTime;
//
//		public String getOutput() {
//			return output;
//		}
//
//		public void setOutput(String output) {
//			firePropertyChange("output", this.output, this.output = output);
//		}
//
//		public void addPropertyChangeListener(String propertyName,
//				PropertyChangeListener listener) {
//			changeSupport.addPropertyChangeListener(propertyName, listener);
//		}
//
//		void firePropertyChange(String propertyName, Object oldValue,
//				Object newValue) {
//			changeSupport.firePropertyChange(propertyName, oldValue, newValue);
//		}
//
//		public void removePropertyChangeListener(String propertyName,
//				PropertyChangeListener listener) {
//			changeSupport.removePropertyChangeListener(propertyName, listener);
//		}
//
//		/**
//		 * @return Returns the input.
//		 */
//		public String getInput() {
//			return input;
//		}
//
//		/**
//		 * @param input
//		 *            The input to set.
//		 */
//		public void setInput(String input) {
//			this.input = input;
//		}
//
//		/**
//		 * @return Returns the buffer.
//		 */
//		public String getBuffer() {
//			return buffer;
//		}
//
//		/**
//		 * @param buffer
//		 *            The buffer to set.
//		 */
//		public void setBuffer(String buffer) {
//			this.buffer = buffer;
//		}
//
//		/**
//		 * @return Returns the saveInBackground.
//		 */
//		public boolean isSaveInBackground() {
//			return saveInBackground;
//		}
//
//		/**
//		 * @param saveInBackground
//		 *            The saveInBackground to set.
//		 */
//		public void setSaveInBackground(boolean saveInBackground) {
//			this.saveInBackground = saveInBackground;
//		}
//
//		/**
//		 * @return Returns the throwExceptionInForeground.
//		 */
//		public boolean isThrowExceptionInForeground() {
//			return throwExceptionInForeground;
//		}
//
//		/**
//		 * @param throwExceptionInForeground
//		 *            The throwExceptionInForeground to set.
//		 */
//		public void setThrowExceptionInForeground(
//				boolean throwExceptionInForeground) {
//			this.throwExceptionInForeground = throwExceptionInForeground;
//		}
//
//		/**
//		 * @return Returns the throwExceptionInBackground.
//		 */
//		public boolean isThrowExceptionInBackground() {
//			return throwExceptionInBackground;
//		}
//
//		/**
//		 * @param throwExceptionInBackground
//		 *            The throwExceptionInBackground to set.
//		 */
//		public void setThrowExceptionInBackground(
//				boolean throwExceptionInBackground) {
//			this.throwExceptionInBackground = throwExceptionInBackground;
//		}
//
//		/**
//		 * @return Returns the foregroundSaveTime.
//		 */
//		public int getForegroundSaveTime() {
//			return foregroundSaveTime;
//		}
//
//		/**
//		 * @param foregroundSaveTime
//		 *            The foregroundSaveTime to set.
//		 */
//		public void setForegroundSaveTime(int foregroundSaveTime) {
//			this.foregroundSaveTime = foregroundSaveTime;
//		}
//
//		/**
//		 * @return Returns the backgroundSaveTime.
//		 */
//		public int getBackgroundSaveTime() {
//			return backgroundSaveTime;
//		}
//
//		/**
//		 * @param backgroundSaveTime
//		 *            The backgroundSaveTime to set.
//		 */
//		public void setBackgroundSaveTime(int backgroundSaveTime) {
//			this.backgroundSaveTime = backgroundSaveTime;
//		}
//	}
//
//	private Data data = new Data();
//
//	public Saveable[] getActiveSaveables() {
//		return new Saveable[] { mySaveable };
//	}
//
//	public Saveable[] getSaveables() {
//		return new Saveable[] { mySaveable };
//	}
//	
//}
